# 网络与通信库 ```{admonition} 本文引用的文件 :class: note - `firmware/port/modules/urequests.py` - [docs/docs/zh_CN/library/mPython/urequests.rst](../../../../products/mpython/library/mPython/urequests.rst) - `firmware/port/modules/umqtt/simple.py` - `firmware/port/modules/umqtt/robust.py` - [docs/docs/zh_CN/library/mPython/umqtt.simple.rst](../../../../products/mpython/library/mPython/umqtt.simple.rst) - `esp32s3/firmware/modules/radio.py` - [docs/docs/zh_CN/library/mPython/radio.rst](../../../../products/mpython/library/mPython/radio.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ``` ## 产品概述 本章节面向 mPython/ESP32-S3 平台的网络与通信能力,聚焦四类常用接口:HTTP 客户端(urequests)、MQTT 客户端(umqtt.simple)、无线广播(radio,基于 ESP-NOW)以及低功耗蓝牙(bluetooth)。它们分别覆盖“请求-响应”的 HTTP 访问、轻量级发布/订阅消息、短距无连接组网与 BLE 设备互联等典型物联网场景,适合传感器数据上报、远程控制、设备间近场通信与云端交互。 ## 核心业务流程 - HTTP 客户端流程 - 解析 URL、选择端口与协议(http/https) - 建立 socket 连接(可选 SSL) - 组装请求头与正文(表单/JSON/文件上传) - 发送请求并读取响应状态码与头部 - 封装 Response 对象,提供 content/text/json 便捷访问 - MQTT 客户端流程 - 创建 MQTTClient,配置服务器、认证、保活、遗嘱 - 建立 TCP/SSL 连接并完成握手 - 发布/订阅主题,设置回调处理入站消息 - 通过 wait_msg/check_msg 在主循环中驱动消息收发 - robust 版本在异常时自动重连 - 无线广播(ESP-NOW)流程 - 初始化 Wi-Fi STA/AP 与 ESP-NOW 栈 - 添加对端 MAC(支持加密/PMK) - 发送单播/广播消息,接收回调或轮询 - 查询对端列表、MAC、RSSI 等信息 - BLE 流程 - 启用 BLE,配置地址模式、MTU、配对参数等 - 作为广播者/观察者/中央/外围角色运行 - 注册 GATT 服务/特征,读写/通知/指示 - 发现远程服务/特征/描述符,执行读/写/交换 MTU - 使用 L2CAP 通道进行面向连接的数据传输 ```text graph TB A["应用代码"] --> B["HTTP 客户端
urequests"] A --> C["MQTT 客户端
umqtt.simple / robust"] A --> D["无线广播
radio (ESP-NOW)"] A --> E["BLE 模块
bluetooth"] B --> F["TCP/SSL 套接字"] C --> G["TCP/SSL 套接字"] D --> H["ESP-NOW 栈"] E --> I["BLE 控制器/GAP/GATT/L2CAP"] ``` **图表来源** - `firmware/port/modules/urequests.py:41-165` - `firmware/port/modules/umqtt/simple.py:8-103` - `esp32s3/firmware/modules/radio.py:19-45` - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:23-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) **章节来源** - `firmware/port/modules/urequests.py:41-165` - `firmware/port/modules/umqtt/simple.py:8-103` - `esp32s3/firmware/modules/radio.py:19-45` - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:23-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ## 功能模块清单 - urequests(HTTP 客户端) - 职责:提供简洁的 HTTP 请求方法(GET/POST/PUT/PATCH/DELETE/HEAD),统一封装响应体与 JSON 解析,支持表单/JSON/文件上传与 HTTPS。 - 用户价值:快速对接 Web API、云平台与本地服务;减少底层 socket 编程复杂度。 - 验收要点:URL 解析正确、参数编码、Content-Type 设置、HTTPS 握手、响应状态码与文本/JSON 获取、超时与错误提示。 - umqtt.simple(MQTT 客户端) - 职责:实现 MQTT 连接、发布、订阅、心跳与遗嘱;robust 版本提供断线重连。 - 用户价值:稳定可靠的发布/订阅消息通道,适配弱网与延迟环境。 - 验收要点:连接/断开、QoS0/1 发布、订阅回调触发、遗嘱生效、check_msg/wait_msg 行为、异常重连。 - radio(无线广播,ESP-NOW) - 职责:基于 ESP-NOW 的无连接短距通信,支持多通道、对端管理、广播/单播、RSSI 与加密。 - 用户价值:多板组网、低开销、低延迟的近场通信。 - 验收要点:通道配置、对端添加/删除、发送成功返回、接收字符串/字节、广播与 RSSI、加密 PMK。 - bluetooth(BLE) - 职责:提供 GAP/GATT/L2CAP 的低功耗蓝牙能力,涵盖广播、扫描、连接、服务发现、读写通知、配对绑定。 - 用户价值:构建 BLE 外设/中心设备,实现手机/网关/传感器互联。 - 验收要点:active/config/irq 事件、gap_advertise/gap_scan/gap_connect、gatts/gattc 操作、L2CAP 收发、MTU 交换、配对与密钥存储。 **章节来源** - [docs/docs/zh_CN/library/mPython/urequests.rst:14-101](../../../../products/mpython/library/mPython/urequests.rst) - [docs/docs/zh_CN/library/mPython/umqtt.simple.rst:17-86](../../../../products/mpython/library/mPython/umqtt.simple.rst) - [docs/docs/zh_CN/library/mPython/radio.rst:9-48](../../../../products/mpython/library/mPython/radio.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:17-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ## 数据与状态 - HTTP 响应模型 - Response 对象缓存 body,提供 content(bytes)、text(str)、json(dict)与 recv。 - 内部维护 raw socket 引用,close 释放资源。 - MQTT 会话与消息 - MQTTClient 维护 client_id、server/port、ssl、keepalive、遗嘱、PID 与回调。 - publish 支持 QoS0/1;wait_msg/check_msg 驱动消息分发。 - robust.MQTTClient 在 OSError 时指数退避重连。 - ESP-NOW 对端与队列 - MPythonESPNow 维护 peer_list、broadcast 标志、Wi-Fi 通道与加密 PMK。 - 支持 send_data/send_msg/broadcast_data,recv/recv_msg 返回源地址与数据,含 RSSI(平台相关)。 - BLE 角色与句柄 - BLE 对象管理活动状态、配置项(mac/addr_mode/gap_name/mtu/bond/mitm/io/le_secure)。 - GAP:广播 interval_us、扫描 duration_ms/interval/window、连接参数。 - GATT:服务/特征/描述符句柄,读写/通知/指示、缓冲大小。 - L2CAP:PSM/CID/MTU 与信用流控。 ```text classDiagram class Response { +raw +encoding -_cached +close() +content +text +json() +recv(dataLen) } class MQTTClient { +client_id +server +port +ssl +keepalive +lw_topic +lw_msg +cb +connect(clean_session) +disconnect() +ping() +publish(topic, msg, retain, qos) +subscribe(topic, qos) +wait_msg() +check_msg() } class MPythonESPNow { +wifi_sta +wifi_ap +wifi_channel +peer_list +broadcast +set_add_peer(peer_mac) +send_data(peer_id, msg) +send_msg(peer_mac, msg) +broadcast_data(msg) +recv(timeout_ms) +get_peer_list(encrypt) +get_mac(mode) +deinit() } class BLE { +active([active]) +config(param=value...) +irq(handler) +gap_advertise(interval_us, adv_data, resp_data, connectable) +gap_scan(duration_ms, interval_us, window_us, active) +gap_connect(addr_type, addr, scan_duration_ms, min_conn_interval_us, max_conn_interval_us) +gatts_register_services(services_definition) +gattc_discover_services(conn_handle, uuid) +l2cap_listen(psm, mtu) +l2cap_connect(conn_handle, psm, mtu) } Response --> "uses" usocket MQTTClient --> "uses" socket MPythonESPNow --> "uses" network.WLAN BLE --> "uses" bluetooth 控制器 ``` **图表来源** - `firmware/port/modules/urequests.py:7-38` - `firmware/port/modules/umqtt/simple.py:8-103` - `esp32s3/firmware/modules/radio.py:13-160` - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:23-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) **章节来源** - `firmware/port/modules/urequests.py:7-38` - `firmware/port/modules/umqtt/simple.py:8-103` - `esp32s3/firmware/modules/radio.py:13-160` - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:23-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ## 关键约束与边界 - 协议与依赖 - urequests 依赖 usocket/ussl/urllib.parse/ujson;仅支持 HTTP/1.0 请求格式,不支持分块传输与重定向。 - umqtt.simple 仅实现 QoS0/1;QoS2 未实现以控制固件体积;所有主题与消息为字节。 - radio 基于 ESP-NOW,需在同一频道内通信,最大包长受协议限制(文档示例为 250 字节级别)。 - bluetooth 为底层 BLE 抽象,部分特性(如 L2CAP)在不同堆栈/平台上可用性不同。 - 性能与资源 - HTTP 请求默认超时(例如 30 秒),注意内存占用与网络抖动。 - MQTT 主循环需定期调用 wait_msg/check_msg 以处理消息;robust 版本有重连延时。 - ESP-NOW 适合短距、低开销、多节点组网;加密会引入额外开销。 - BLE 广播间隔与扫描窗口影响功耗与发现速度;MTU 协商影响吞吐。 - 安全与配置 - HTTPS 需要证书校验策略由底层实现决定;MQTT 可配置用户名/密码与遗嘱。 - ESP-NOW 支持 PMK 加密与 LMN;BLE 支持配对/绑定与 MITM 选项。 - 兼容性 - 不同板型/固件可能包含/排除某些模块(如 radio 在 ESP32 与 ESP32-S3 的实现差异)。 - BLE 常量与事件需在应用中自行定义(节省空间)。 **章节来源** - `firmware/port/modules/urequests.py:41-165` - [docs/docs/zh_CN/library/mPython/umqtt.simple.rst:81-86](../../../../products/mpython/library/mPython/umqtt.simple.rst) - [docs/docs/zh_CN/library/mPython/radio.rst:9-48](../../../../products/mpython/library/mPython/radio.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:210-258](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ## 详细 API 参考 ### urequests(HTTP 客户端) - 类与方法 - Response - close():关闭底层 socket 并清理缓存 - content:返回响应体字节(带缓存) - text:按 encoding 解码为字符串 - json():将响应体解析为 dict - recv(dataLen):从原始流读取指定长度 - request(method, url, data=None, json=None, headers={}, params=None, files=None) - 支持 GET/POST/PUT/PATCH/DELETE/HEAD 快捷函数 - 自动处理 URL 参数编码、表单/JSON 序列化、文件上传 multipart/form-data - 支持 https(ussl)与 http(明文) - 典型用法 - 获取 JSON 数据:get(url).json() - 提交表单:post(url, data={...}) - 上传文件:post(url, files={'name': ('path', 'type')}) ```text sequenceDiagram participant App as "应用" participant UR as "urequests.request" participant Sock as "socket/ssl" App->>UR : get/post/put/... UR->>UR : 解析URL/参数/编码 UR->>Sock : 建立连接(可选SSL) UR->>Sock : 发送请求头与正文 Sock-->>UR : 状态行与头部 UR-->>App : Response(content/text/json) ``` **图表来源** - `firmware/port/modules/urequests.py:41-165` **章节来源** - [docs/docs/zh_CN/library/mPython/urequests.rst:14-101](../../../../products/mpython/library/mPython/urequests.rst) - `firmware/port/modules/urequests.py:41-165` ### umqtt.simple(MQTT 客户端) - 类与方法 - MQTTClient(client_id, server, port=0, user=None, password=None, keepalive=0, ssl=False, ssl_params={}) - set_callback(f):设置订阅消息回调 f(topic, msg) - set_last_will(topic, msg, retain=False, qos=0):设置遗嘱 - connect(clean_session=True):建立连接 - disconnect():断开连接 - ping():心跳 - publish(topic, msg, retain=False, qos=0):发布消息(QoS0/1) - subscribe(topic, qos=0):订阅主题 - wait_msg():阻塞等待消息 - check_msg():非阻塞检查消息 - robust 增强 - reconnect():异常后自动重连 - publish()/wait_msg():捕获 OSError 并重连 ```text flowchart TD Start(["启动"]) --> Init["创建MQTTClient"] Init --> Connect{"连接成功?"} Connect -- 否 --> Reconnect["reconnect()重试"] Reconnect --> Connect Connect -- 是 --> Loop{"主循环"} Loop --> Publish["publish(topic,msg,qos)"] Loop --> Subscribe["subscribe(topic,qos)"] Loop --> Wait["wait_msg()/check_msg()"] Wait --> Callback["回调f(topic,msg)"] Callback --> Loop Publish --> Loop Subscribe --> Loop ``` **图表来源** - `firmware/port/modules/umqtt/simple.py:8-103` - `firmware/port/modules/umqtt/robust.py:20-46` **章节来源** - [docs/docs/zh_CN/library/mPython/umqtt.simple.rst:17-86](../../../../products/mpython/library/mPython/umqtt.simple.rst) - `firmware/port/modules/umqtt/simple.py:8-103` - `firmware/port/modules/umqtt/robust.py:20-46` ### radio(无线广播,ESP-NOW) - 能力概览 - 基于 ESP-NOW,支持多通道、对端管理、广播/单播、RSSI、加密(PMK) - 适用于 30 米范围内多板组网 - 主要方法 - on()/off():开启/关闭无线电 - config(channel):配置通道(1~13) - receive()/receive_bytes():接收消息(字符串/字节),可返回 (msg, mac) - send()/send_bytes():发送消息(字符串/字节),返回成功与否 - 高级封装(ESP32-S3 示例):MPythonESPNow 提供 add_peer、send_data、broadcast_data、recv、get_peer_list、get_mac、set_pmk_encrypt 等 ```text sequenceDiagram participant A as "设备A" participant RadioA as "radio(MPYthonESPNow)" participant RadioB as "radio(MPYthonESPNow)" A->>RadioA : set_add_peer(B_MAC) A->>RadioA : send_msg(B_MAC, msg) RadioA->>RadioB : ESP-NOW 单播 RadioB-->>RadioB : recv()/recv_msg() Note over RadioB : 可获取MAC/RSSI(平台相关) ``` **图表来源** - `esp32s3/firmware/modules/radio.py:46-132` **章节来源** - [docs/docs/zh_CN/library/mPython/radio.rst:9-48](../../../../products/mpython/library/mPython/radio.rst) - `esp32s3/firmware/modules/radio.py:19-160` ### bluetooth(BLE) - 角色与生命周期 - 激活与配置:active([active])、config(...)(mac/addr_mode/gap_name/mtu/bond/mitm/io/le_secure) - 事件:irq(handler) 统一处理 GAP/GATT/L2CAP 事件 - GAP - 广播:gap_advertise(interval_us, adv_data, resp_data, connectable) - 扫描:gap_scan(duration_ms, interval_us, window_us, active) - 连接:gap_connect(addr_type, addr, scan_duration_ms, min_conn_interval_us, max_conn_interval_us) - 断开:gap_disconnect(conn_handle) - GATT 服务器 - gatts_register_services(services_definition):注册服务/特征/描述符 - gatts_read/write/notify/indicate:读写与推送 - gatts_set_buffer:设置值缓冲大小 - GATT 客户端 - gattc_discover_services/characteristics/descriptors:发现 - gattc_read/write:读取/写入 - gattc_exchange_mtu:交换 MTU - L2CAP - l2cap_listen/connect/disconnect/send/recvinto:面向连接通道 ```text sequenceDiagram participant Central as "中央设备" participant Peripheral as "外围设备" Central->>Peripheral : gap_scan -> _IRQ_SCAN_RESULT Central->>Peripheral : gap_connect -> _IRQ_PERIPHERAL_CONNECT Peripheral->>Central : gatts_notify/indicate Central->>Peripheral : gattc_read/write Central->>Peripheral : gattc_exchange_mtu -> _IRQ_MTU_EXCHANGED Central->>Peripheral : l2cap_connect -> _IRQ_L2CAP_CONNECT ``` **图表来源** - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:261-333](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:336-466](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:469-507](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) **章节来源** - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:17-79](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) - [esp32s3/docs/5_api/library/micropython/bluetooth.rst:261-507](../../../../products/mpython-s3/5_api/library/micropython/bluetooth.rst) ## 故障排查与最佳实践 - HTTP - 若出现“Unsupported protocol”或“Invalid URL”,检查 URL 格式与协议前缀 - 大文件或慢网络建议合理设置超时与重试 - 文件上传需确保 Content-Type 与 boundary 正确 - MQTT - 未设置回调即订阅会报错;确保先 set_callback - 主循环必须调用 wait_msg()/check_msg() 以处理消息 - 网络不稳定时使用 robust 版本,避免频繁手动重连 - ESP-NOW - 对端未添加或信道不一致会导致发送失败;确认 channel 与 MAC - 加密需双方设置相同 PMK;否则无法解密 - 接收侧需及时消费缓冲区,避免丢包 - BLE - 广播/扫描参数影响功耗与发现成功率;按需调整 interval/window - MTU 协商前后可测量实际吞吐;过大可能导致丢包 - 配对/绑定需实现 _IRQ_GET_SECRET/_IRQ_SET_SECRET 以持久化密钥 [本节为通用指导,不直接分析具体文件] ## 结论 urequests、umqtt.simple、radio 与 bluetooth 共同构成了 mPython/ESP32-S3 平台的核心网络与通信能力。根据应用场景选择合适的协议与抽象层:HTTP 用于云端交互,MQTT 用于轻量消息总线,ESP-NOW 用于近场多节点组网,BLE 用于低功耗设备互联。结合本文档的 API 说明与流程图,可快速搭建稳定的 IoT 解决方案。 [本节为总结性内容,不直接分析具体文件]